sysroot: Add API to clean up transient keys in origin files
authorColin Walters <walters@verbum.org>
Fri, 23 Feb 2018 19:23:38 +0000 (14:23 -0500)
committerAtomic Bot <atomic-devel@projectatomic.io>
Mon, 26 Feb 2018 19:06:59 +0000 (19:06 +0000)
The `origin/unlocked` and `origin/override-commit` keys are examples of state
that's really transient; we don't want to maintain them across upgrades. Right
now there are bits for this in both `ostree admin upgrade` as well as in
rpm-ostree.

This new API will slightly clean up both cases, but it's really prep for adding
a concept of deployment "pinning" that will live in the new
`libostree-transient` group.

Closes: #1464
Approved by: jlebon

apidoc/ostree-sections.txt
src/libostree/libostree-devel.sym
src/libostree/ostree-deployment.c
src/libostree/ostree-deployment.h
src/ostree/ot-admin-builtin-upgrade.c

index 4421ed10d61e82ea01822b7d38cb74b6454a7dc7..892aa0c08fb36cd8b3db2006392ee2d7128d346c 100644 (file)
@@ -173,6 +173,7 @@ ostree_deployment_set_index
 ostree_deployment_set_bootserial
 ostree_deployment_set_bootconfig
 ostree_deployment_set_origin
+ostree_deployment_origin_remove_transient_state
 ostree_deployment_clone
 ostree_deployment_unlocked_state_to_string
 <SUBSECTION Standard>
index 3f3a45b5bd9b3c91d8066be31818a3e30bf6b3f7..123627a4f9f5f6cc378176060aa36365f030c6f4 100644 (file)
@@ -19,6 +19,7 @@
 
 /* Add new symbols here.  Release commits should copy this section into -released.sym. */
 LIBOSTREE_2018.3 {
+  ostree_deployment_origin_remove_transient_state;
 } LIBOSTREE_2018.2;
 
 /* Stub section for the stable release *after* this development one; don't
index 6431aa96c62f9e98f9f23c8a136c87bf6f0c5fa8..2c479fdb74732518bf373c6763286572839c4593 100644 (file)
@@ -121,6 +121,35 @@ ostree_deployment_set_origin (OstreeDeployment *self, GKeyFile *origin)
     self->origin = g_key_file_ref (origin);
 }
 
+/**
+ * ostree_deployment_origin_remove_transient_state:
+ * @origin: An origin
+ *
+ * The intention of an origin file is primarily describe the "inputs" that
+ * resulted in a deployment, and it's commonly used to derive the new state. For
+ * example, a key value (in pure libostree mode) is the "refspec". However,
+ * libostree (or other applications) may want to store "transient" state that
+ * should not be carried across upgrades.
+ *
+ * This function just removes all members of the `libostree-transient` group.
+ * The name of that group is available to all libostree users; best practice
+ * would be to prefix values underneath there with a short identifier for your
+ * software.
+ *
+ * Additionally, this function will remove the `origin/unlocked` and
+ * `origin/override-commit` members; these should be considered transient state
+ * that should have been under an explicit group.
+ *
+ * Since: 2018.3
+ */
+void
+ostree_deployment_origin_remove_transient_state (GKeyFile *origin)
+{
+  g_key_file_remove_group (origin, OSTREE_ORIGIN_TRANSIENT_GROUP, NULL);
+  g_key_file_remove_key (origin, "origin", "override-commit", NULL);
+  g_key_file_remove_key (origin, "origin", "unlocked", NULL);
+}
+
 void
 _ostree_deployment_set_bootcsum (OstreeDeployment *self,
                                  const char *bootcsum)
index b4368f46501c0a0a755451ad11f2e5b4b4a6ac55..985c813312540e9628568aed8626c532830999fe 100644 (file)
@@ -27,6 +27,17 @@ G_BEGIN_DECLS
 #define OSTREE_DEPLOYMENT(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), OSTREE_TYPE_DEPLOYMENT, OstreeDeployment))
 #define OSTREE_IS_DEPLOYMENT(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), OSTREE_TYPE_DEPLOYMENT))
 
+/**
+ * OSTREE_ORIGIN_TRANSIENT_GROUP:
+ *
+ * The name of a `GKeyFile` group for data that should not
+ * be carried across upgrades.  For more information,
+ * see ostree_deployment_origin_remove_transient_state().
+ *
+ * Since: 2018.3
+ */
+#define OSTREE_ORIGIN_TRANSIENT_GROUP "libostree-transient"
+
 typedef struct _OstreeDeployment OstreeDeployment;
 
 _OSTREE_PUBLIC
@@ -62,6 +73,7 @@ OstreeBootconfigParser *ostree_deployment_get_bootconfig (OstreeDeployment *self
 _OSTREE_PUBLIC
 GKeyFile *ostree_deployment_get_origin (OstreeDeployment *self);
 
+
 _OSTREE_PUBLIC
 void ostree_deployment_set_index (OstreeDeployment *self, int index);
 _OSTREE_PUBLIC
@@ -71,6 +83,9 @@ void ostree_deployment_set_bootconfig (OstreeDeployment *self, OstreeBootconfigP
 _OSTREE_PUBLIC
 void ostree_deployment_set_origin (OstreeDeployment *self, GKeyFile *origin);
 
+_OSTREE_PUBLIC
+void ostree_deployment_origin_remove_transient_state (GKeyFile *origin);
+
 _OSTREE_PUBLIC
 OstreeDeployment *ostree_deployment_clone (OstreeDeployment *self);
 
index e42ded6cabd9997dbfaf090ca20f03981daf8419..1b6a0253404b5a0431bd96197fa3072e3e88a2f6 100644 (file)
@@ -88,33 +88,18 @@ ot_admin_builtin_upgrade (int argc, char **argv, OstreeCommandInvocation *invoca
   g_autoptr(GKeyFile) origin = ostree_sysroot_upgrader_dup_origin (upgrader);
   if (origin != NULL)
     {
-      gboolean origin_changed = FALSE;
-
+      /* Should we consider requiring --discard-hotfix here? */
+      ostree_deployment_origin_remove_transient_state (origin);
       if (opt_override_commit != NULL)
         {
           /* Override the commit to pull and deploy. */
           g_key_file_set_string (origin, "origin",
                                  "override-commit",
                                  opt_override_commit);
-          origin_changed = TRUE;
         }
-      else
-        {
-          /* Strip any override-commit from the origin file so
-           * we always upgrade to the latest available commit. */
-          origin_changed = g_key_file_remove_key (origin, "origin",
-                                                  "override-commit", NULL);
-        }
-
-      /* Should we consider requiring --discard-hotfix here? */
-      origin_changed |= g_key_file_remove_key (origin, "origin", "unlocked", NULL);
 
-      if (origin_changed)
-        {
-          /* XXX GCancellable parameter is not used. */
-          if (!ostree_sysroot_upgrader_set_origin (upgrader, origin, NULL, error))
-            return FALSE;
-        }
+      if (!ostree_sysroot_upgrader_set_origin (upgrader, origin, NULL, error))
+        return FALSE;
     }
 
   gboolean changed;